#include <stdio.h>
#ifdef WIN32
#include <curses.h>
#else
#include <ncurses.h>
#endif

#include <assert.h>
#include <time.h>
#include "Jeu.h"



void ncursAffTerrain( WINDOW* win, const Jeu *pJeu)
{
	int x,y;

	const Terrain *pTer = jeuGetConstTerrainPtr(pJeu);

	for(x=0;x<(pTer->dimx);++x)
		for(y=0;y<(pTer->dimy);++y)
			mvwprintw( win, y, x, "%c", terrainGetXY(pTer,x,y) );

}

void ncursAffSnake( WINDOW* win, const Jeu *pJeu)
{

	const Snake *pSnake1 = jeuGetConstSnake1Ptr(pJeu);
    const Snake *pSnake2 = jeuGetConstSnake2Ptr(pJeu);

	mvwprintw( win, snakeGetY(pSnake1), snakeGetX(pSnake1), "*");
	mvwprintw( win, snakeGetY(pSnake2), snakeGetX(pSnake2), "*");

}
void ncursAffBonus(WINDOW* win, Jeu *pJeu)
{
    Bonus *pBonus = jeuGetConstBonusPtr(pJeu);
    initBonus(pBonus);
    mvwprintw( win, getBonusY(pBonus), getBonusX(pBonus), "X");
}


void ncursBoucle(Jeu *pJeu)
{
	WINDOW *win, *screen;
	int c;
	int continue_boucle;
	int compteur_bonus = 0;



	 /* Horloges (en secondes) */
    float horloge_courante, horloge_precedente;

    /* Intervalle de temps (en secondes) entre deux évolutions du jeu */
    /* Changer la valeur pour ralentir ou accélérer le déplacement des fantomes */
    float intervalle_horloge = 0.1f;

	screen = initscr();		/* passe l'écran texte en mode NCurses */
	clear();		/* efface l'écran */
	noecho();  	/* Lorsqu'une touche est préssée au clavier, elle n'apparait pas a à l'écran */
	cbreak();		/* un caractère est directement affiché, il ne passe pas dans un buffer */

	/* Creation d'une nouvelle fenetre en mode texte */
	/* => fenetre de dimension et position ( WIDTH, HEIGHT, STARTX,STARTY) */
	win = newwin( (jeuGetConstTerrainPtr(pJeu)->dimy), (jeuGetConstTerrainPtr(pJeu)->dimx), 10, 5 );
	keypad(win, TRUE);		/* pour que les flèches soient traitées (il faut le faire après création de la fenêtre) */

	/*halfdelay(temps_dizieme);*/
	/* notimeout(win,true); */
	/* wtimeout( win, 500 ); */
	nodelay(win,true); /* Pour que l'appel à wgetch soit non-bloquant */

	continue_boucle = 1;

	/* Récupère l'horloge actuelle et la convertit en secondes */
    /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
    horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;

    ncursAffTerrain( win, pJeu);
    ncursAffSnake( win, pJeu);

	do
	{
	    /* Récupère l'horloge actuelle et la convertit en secondes */
        /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;

        if (horloge_courante-horloge_precedente>=intervalle_horloge)
        {
                compteur_bonus++;
                jeuEvolue(pJeu);
                ncursAffSnake( win, pJeu);
                horloge_precedente = horloge_courante;
        }

       if (compteur_bonus == 50)
       {
           ncursAffBonus(win, pJeu);
	   compteur_bonus=0;
       }
        if (pJeu->score1++ || pJeu->score2++)
        {
            ncursAffTerrain( win, pJeu);
            ncursAffSnake( win, pJeu);
        }

		c = wgetch(win);
		/* jeuActionClavier( jeu, 'd'); */
		switch(c)
		{
			case KEY_LEFT:
				jeuActionClavier( pJeu, 'g');
				ncursAffSnake( win, pJeu);
				break;
			case KEY_RIGHT:
				jeuActionClavier( pJeu, 'd');
				ncursAffSnake( win, pJeu);
				break;
			case KEY_UP:
				jeuActionClavier( pJeu, 'h');
				ncursAffSnake( win, pJeu);
				break;
			case KEY_DOWN:
				jeuActionClavier( pJeu, 'b');
				ncursAffSnake( win, pJeu);
				break;
			case 27: /* ECHAP */
				continue_boucle = 0;
				break;
		}
	} while (continue_boucle==1);

    assert(delwin(win)!=ERR);
    assert(delwin(screen)!=ERR);

	endwin();
}
